/**
 * 权限工具函数
 */

import { useUserStore } from '@/stores/user'

/**
 * 检查是否有权限
 * @param {string} resource 资源标识
 * @param {string} action 操作类型
 * @returns {boolean}
 */
export function hasPermission(resource, action) {
  const userStore = useUserStore()
  const userInfo = userStore.userInfo
  
  // 如果没有用户信息，返回false
  if (!userInfo) {
    console.warn('权限检查失败：用户信息不存在', { resource, action })
    return false
  }
  
  // 检查是否是管理员（支持多种数据类型：true, 1, "1", "true"）
  const isAdmin = userInfo.is_admin === true || 
                  userInfo.is_admin === 1 || 
                  userInfo.is_admin === '1' || 
                  userInfo.is_admin === 'true' ||
                  (userInfo.role_codes && Array.isArray(userInfo.role_codes) && userInfo.role_codes.includes('admin'))
  
  // 管理员拥有所有权限
  if (isAdmin) {
    return true
  }
  
  const permissions = userInfo.permissions || {}
  
  // 如果没有权限数据，返回false
  if (!permissions || Object.keys(permissions).length === 0) {
    console.warn('权限检查失败：权限数据为空', { resource, action, userInfo })
    return false
  }
  
  // 检查资源权限
  if (permissions[resource] && Array.isArray(permissions[resource]) && permissions[resource].includes(action)) {
    return true
  }
  
  return false
}

/**
 * 检查是否有查看权限
 * @param {string} resource 资源标识
 * @returns {boolean}
 */
export function canView(resource) {
  return hasPermission(resource, 'view')
}

/**
 * 检查是否有新增权限
 * @param {string} resource 资源标识
 * @returns {boolean}
 */
export function canCreate(resource) {
  return hasPermission(resource, 'create')
}

/**
 * 检查是否有编辑权限
 * @param {string} resource 资源标识
 * @returns {boolean}
 */
export function canUpdate(resource) {
  return hasPermission(resource, 'update')
}

/**
 * 检查是否有删除权限
 * @param {string} resource 资源标识
 * @returns {boolean}
 */
export function canDelete(resource) {
  return hasPermission(resource, 'delete')
}

/**
 * 检查是否有导出权限
 * @param {string} resource 资源标识
 * @returns {boolean}
 */
export function canExport(resource) {
  return hasPermission(resource, 'export')
}

/**
 * 权限指令
 */
export default {
  mounted(el, binding) {
    checkPermission(el, binding)
  },
  updated(el, binding) {
    checkPermission(el, binding)
  },
}

/**
 * 检查权限并控制元素显示/隐藏
 */
function checkPermission(el, binding) {
  const { value } = binding
  
  if (!value) {
    return
  }
  
  let hasAuth = false
  
  if (typeof value === 'string') {
    // 单个权限：'users.view'
    const [resource, action] = value.split('.')
    if (!resource || !action) {
      console.warn('权限指令格式错误，应为 "resource.action" 格式:', value)
      return
    }
    hasAuth = hasPermission(resource, action)
  } else if (Array.isArray(value)) {
    // 多个权限：['users.view', 'users.create']
    hasAuth = value.some(perm => {
      const [resource, action] = perm.split('.')
      if (!resource || !action) {
        console.warn('权限指令格式错误，应为 "resource.action" 格式:', perm)
        return false
      }
      return hasPermission(resource, action)
    })
  } else if (typeof value === 'object') {
    // 对象形式：{ resource: 'users', action: 'view' }
    if (!value.resource || !value.action) {
      console.warn('权限指令对象格式错误，应包含 resource 和 action 字段:', value)
      return
    }
    hasAuth = hasPermission(value.resource, value.action)
  }
  
  // 使用 display 样式控制元素显示/隐藏，而不是移除元素
  // 这样可以在用户信息更新后自动更新显示状态
  if (!hasAuth) {
    // 如果没有权限，隐藏元素
    el.style.display = 'none'
    // 添加数据属性，标记为权限隐藏
    el.setAttribute('data-permission-hidden', 'true')
  } else {
    // 如果有权限，显示元素
    el.style.display = ''
    // 移除权限隐藏标记
    el.removeAttribute('data-permission-hidden')
  }
}

